<?php
	// ################################
	// # Classe com funções de Sessão #
	// ################################
	class Session
	{
		private $prefixo_projeto;
		
		public function __construct($prefixo_projeto_valor = null)
		{
			require(dirname(__FILE__).'/../dados.php');
			$this->prefixo_projeto = ($prefixo_projeto_valor == null) ? $prefixo_projeto : 'default';
			session_start();
		}
		
		// Testa se o usuário está logado
		public function teste_logado() {
			if($_SESSION[md5($this->prefixo_projeto . 'logged')]) {
				return true;
			} else {
				return false;
			}
		}
		
		// Seta uma mensagem na session 0 = sucesso, 1 = erro, 2 = info
		public function set_session_msg($tipo, $mensagem) {
			$_SESSION[md5($this->prefixo_projeto . 'mensagem')][$tipo] = $mensagem;
		}
		
		// Verifica se tem mensagem na session
		public function exists_session_msg() {
			return isset($_SESSION[md5($this->prefixo_projeto . 'mensagem')]);
		}
		
		// Junta as mensagens setadas na session numa string
		public function get_session_msg($remove_mensagem_session = true) {
			$mensagens = "";
			if(!empty($_SESSION[md5($this->prefixo_projeto . 'mensagem')])) {
				
				$mensagens .= '<div id="session_msg">';
				
				$last = end($_SESSION[md5($this->prefixo_projeto . 'mensagem')]);
				foreach($_SESSION[md5($this->prefixo_projeto . 'mensagem')] as $index => $value) {
					switch($index) {
						// sucesso
						case SUCESSO:
							$msg = '<span class="sucesso">'. $value .'</span>';
							break;
						// erro
						case ERRO:
							$msg = '<span class="erro">'. $value .'</span>';
							break;
						//info
						case INFO:
							$msg = '<span class="info">'. $value .'</span>';
							break;
					}
					
					$mensagens .= $msg;
					
					if($value != $last)
						$mensagens .= '<br />';
				}
				
				$mensagens .= '</div>';
				
				if($remove_mensagem_session) unset($_SESSION[md5($this->prefixo_projeto . 'mensagem')]);
				return $mensagens;
			}
		}
		
		// Faz echo em get_session_msg
		public function print_session_msg($remove_mensagem_session = true){
			echo $this->get_session_msg($remove_mensagem_session);
		}
		
		// Redirecionar passando uma mensagem
		public function redireciona_mostrando_mensagem($mensagem, $retorno = './', $tipo = "INFO")
		{
			$this->set_session_msg($tipo, $mensagem);
			header('Location: '.$retorno);
		}
		
		// Redirecionar passando a mensagem de sucesso
		public function redireciona_mostrando_mensagem_sucesso($mensagem_sucesso, $retorno = './')
		{
			return $this->redireciona_mostrando_mensagem($mensagem_sucesso, $retorno, "SUCESSO");
		}
		
		// Redirecionar passando a mensagem de sucesso
		public function redireciona_mostrando_mensagem_erro($mensagem_erro, $retorno = './')
		{
			return $this->redireciona_mostrando_mensagem($mensagem_erro, $retorno, "ERRO");
		}
		
		// Loga o usuário no sistema
		// Salva o id do usuário logado, a tabela aonde tem o login e a senha, e seu nivel de acesso caso esses sejam passados
		public function login($id_logado = null, $tabela = null, $nivel = null) {
			$_SESSION[md5($this->prefixo_projeto . 'logged')] = true;
			$_SESSION[md5($this->prefixo_projeto . 'id_logado')] = $id_logado;
			$_SESSION[md5($this->prefixo_projeto . 'tabela')] = $tabela;
			$_SESSION[md5($this->prefixo_projeto . 'nivel')] = $nivel;
		}
		
		// Desloga o usuário do sistema
		public function logout() {
			if($_SESSION[md5($this->prefixo_projeto . 'logged')])
			{
				unset( $_SESSION[md5($this->prefixo_projeto . 'logged')] );
				unset( $_SESSION[md5($this->prefixo_projeto . 'id_logado')] );
				unset( $_SESSION[md5($this->prefixo_projeto . 'tabela')] );
				unset( $_SESSION[md5($this->prefixo_projeto . 'nivel')] );
			}
		}
		
		//	Salva um objeto na Session, usando um nome passado
		public function salva_obj($name, $obj)
		{
			// $s recebe uma sequencia de bytes que representam o objeto passado
			$s = serialize($obj);
			
			// salvo ele na session
			$this->$name = $s;
		}
		
		// Para recuperar um objeto, o arquivo que chama essa função deve ter um require para o arquivo da classe desse objeto
		public function recupera_obj($name)
		{
			// $s recebe uma sequencia de bytes que representam o objeto passado
			$s = $this->$name;
			
			// retorna o valor do objeto
			return unserialize($s);			
		}
		
		// Reseta os valores de session
		public function reset()
		{
			//session_destroy();
			session_unset();
			$_SESSION = array();
		}
		
		// Overloading
				
		// Se não existe na classe Session, atribui no array de session
		public function __set($name, $value) 
		{
			$name = md5($this->prefixo_projeto . $name);
	        $_SESSION[$name] = $value;
	    }
		// Se existe na classe Session, retorna o valor, pegando do array de session
	    public function __get($name) 
	    {
	    	$name = md5($this->prefixo_projeto . $name);
	        if (array_key_exists($name, $_SESSION)) 
	        {
	            return $_SESSION[$name];
	        }
	
	        $trace = debug_backtrace();
	        trigger_error(
	            'Essa propriedade não existe na SESSION: ' . $name .
	            ' no arquivo ' . $trace[0]['file'] .
	            ' na linha ' . $trace[0]['line'],
	            E_USER_NOTICE);
	        return null;
	    }
	
	    // Verifica se a variável existe na session
	    public function __isset($name) 
	    {
	    	$name = md5($this->prefixo_projeto . $name);
	        return isset($_SESSION[$name]);
	    }
	    
	    // Retira a variável da session	
	    public function __unset($name) 
	    {
	    	$name = md5($this->prefixo_projeto . $name);
	        unset($_SESSION[$name]);
	    }
	}
?>